#ifndef _RAW_HEADER_H
#define _RAW_HEADER_H

#define RAW_KWSIZE		80

void CopyString(char *&szDest, const char *szSrc) {
	if(szDest) {delete szDest; szDest=NULL;}
	
	if(szSrc) { //copy to destination string
		szDest=new char[strlen(szSrc)+1]; 
		strcpy(szDest,szSrc);
	} 
}

void TrimString(char *&szDest, const char *szSrc) {
	if(szDest) {delete szDest; szDest=NULL;}
	
	if(szSrc) {
		char szTemp[128], *pcStart, *pcEnd;
		
		pcStart=strchr(szSrc,'\''); //find start quote
		if(!pcStart) sscanf(szSrc,"%s",szTemp); //no quotes
		else { //string in quotes
			pcEnd=strrchr(szSrc,'\'')-1; //find end quote
			while(*pcEnd==' ') pcEnd--;
			int iLength=pcEnd-pcStart;
			memcpy(szTemp,pcStart+1,iLength);
			szTemp[iLength]='\0';
		}
		
		//copy to destination string
		szDest=new char[strlen(szTemp)+1]; 
		strcpy(szDest,szTemp);
	} 
}

class cRawKeyword {
public:
	cRawKeyword() {szName=szValue=NULL;}
	~cRawKeyword() {Clear();}
	
	void Clear() {
		if(szName) delete szName;
		if(szValue) delete szValue;
		szName=szValue=NULL;
	}
	
	int Read(HFILE hfRaw) {
		char lprgbHeader[RAW_KWSIZE+1];
		unsigned long ulBytesRead;
		lprgbHeader[RAW_KWSIZE]='\0';

		if(!ReadFile((HANDLE)hfRaw,lprgbHeader,RAW_KWSIZE,&ulBytesRead,0))
			return GetLastError(); //read error

		if(ulBytesRead!=RAW_KWSIZE) { //wrong read size
			int iError=GetLastError();
			if(!iError) iError=ERROR_HANDLE_EOF;
			return iError;
		}

		char *szTok;
		
		szTok=strtok(lprgbHeader,"="); //get name
		TrimString(szName,szTok); 
		
		szTok=strtok(NULL,"="); //get value
		TrimString(szValue,szTok); 
		
		//set numeric value
		if(szValue) dValue=atof(szValue);
		else dValue=0;

		return 0;
	}
	
	void operator = (cRawKeyword &kwCopy) {
		CopyString(szName,kwCopy.szName);
		CopyString(szValue,kwCopy.szValue);
	}

	char *szName, *szValue;
	double dValue;
};

class cRawHeader {
public:
	cRawHeader() {iKeywords=0;}
	~cRawHeader() {Clear();}

	void Clear() {
		for(int iIndex=0; iIndex<iKeywords; iIndex++)
			lprgkwKeywords[iIndex].Clear();
		
		iKeywords=0;
	}

	void Add(cRawKeyword &kwNewKeyword) {
		lprgkwKeywords[iKeywords++]=kwNewKeyword;
	}
	
	cRawKeyword lprgkwKeywords[128];
	int iKeywords;
};

#endif
